---
title: 子查询
description: 子查询是嵌套在查询中的查询，可以让我们进行更复杂的查询，同时更加容易理解查询的过程。因为很多时候无法直接从数据表中得到查询结果，需要从查询结果集中再次进行查询，才能得到想要的结果。
---
子查询是嵌套在查询中的查询（会得到一个查询结果集），可以让我们进行更复杂的查询，同时更加容易理解查询的过程。因为很多时候无法直接从数据表中得到查询结果，需要从查询结果集中再次进行查询，才能得到想要的结果。

1. 子查询可以分为关联子查询和非关联子查询。
2. 子查询中有一些关键字，可以对子查询的结果进行比较。比如存在性检测子查询（EXISTS 子查询），以及集合比较子查询（IN、SOME、ANY、ALL）
3. 子查询也可以作为主查询的列（使用子查询作为计算字段出现在 SELECT 查询中）

## 关联子查询和非关联子查询
子查询虽然是一种嵌套查询的模式，但是我们依然可以依据子查询是否执行多次，从而将其分为关联子查询和非关联子查询。

子查询从数据表中查询了数据结果，如果只执行了一次，并且这个数据结果作为主查询的条件进行执行，那么这样的子查询叫做非关联子查询。

如果子查询需要执行多次，即采用循环的方式，先从外部开始，每次都传入子查询进行查询，然后再将结果反馈到外部，这种嵌套的执行方式就称为关联子查询。

这里以 NBA 球员数据表为例。

```sql title='假设我们想知道那个球员的身高最高，最高身高是多少，就可以采用子查询的方式'
mysql> SELECT player_name,height FROM player WHERE height = (SELECT max(height) FROM player);
+-------------+--------+
| player_name | height |
+-------------+--------+
| 索恩-马克   |   2.16 |
+-------------+--------+
1 row in set (0.00 sec)
```

通过 SELECT max(height) FROM player 可以得到最高身高这个数值，结果为 2.16 ， 然后再通过 player 这个表，看谁具有这个身高，再进行输出，这样的子查询就是非关联子查询。



